package com.controller;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.PongMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;

import com.entity.UserModel;
import com.service.UserModelService;
/**
 * 
 * 包      名 ：  com.config
 * 文 件 名 : UserWebSocketHandler
 * 描       述: Socket 连接建立监听
 * 作        者： 超哥
 * 创建时间： 2016年8月14日 上午9:23:26
 * 版         本：1.0
 */
public class UserWebSocketHandler implements  WebSocketHandler{

	 public static  Logger log = Logger.getLogger(UserWebSocketHandler.class);
	
	
	 /**
      * webscoket建立好链接之后的处理函数
      * @param session 当前websocket的会话id，打开一个websocket通过都会生成唯一的一个会话，可以通过该id进行发送消息到浏览器客户端
      */
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    	//获取连接参数 
    	System.out.println("userId=="+session.getAttributes().get("userId"));  
    	//session.getAttributes().put("userid", "xxxx");//如果有用户登录，可以把用户的id绑定到session里面，便于后面做精准推送 
    	 String userId  = (String) session.getAttributes().get("userId");
    	 String userType= (String) session.getAttributes().get("userType");
    	 UserModel userModel = new UserModel();
    	 userModel.setUserId(userId);
    	 userModel.setType(userType);
    	
    	 session.getAttributes().put("userModel", userModel);
         
         
    	 JSONObject result = new JSONObject();
     	// 触发连接事件，在连接池中添加连接
 		result.element("type", "user_join");
 		result.element("user", userId);
 	    UserModelService.sendMessageToAllUser(result.toString());//向所有在线用户推送当前用户上线的消息
         
 		 //添加连接 判断是否存在
   	    UserModelService.users.put(userId,session); //每个链接来的客户端都把WebSocketSession保存进来
	 
   	    
 		result = new JSONObject();
		result.element("type", "get_online_user");
		result.element("list", UserModelService.getOnlineUser());
		UserModelService.sendMessageToUser(userId, result.toString());//向当前连接发送当前在线用户的列表
    
    
    }

    /**
     * 客户端发送服务器的消息时，的处理函数，在这里收到消息之后可以分发消息
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
    /*	for (UserModel userModel : users) {
            //Long id = (Long) session.getAttributes().get("userid");//可以通过获取userid进行匹配，从而进行精准推送
    		ByteBuffer buffer = ByteBuffer.wrap((byte[]) message.getPayload());
    		message = new BinaryMessage(buffer);
            userModel.getSession().sendMessage(message); //全部推送
        }*/
    	Object command=message.getPayload();
    	JSONObject jsonObject = new JSONObject();
    	String userId  = (String) session.getAttributes().get("userId");
    	try {  
            if (message instanceof PongMessage) {//WebSocket连接会有心跳消息，所以需要过滤  
                return;  
            }else if(message instanceof BinaryMessage){ //二进制消息
            	
            
              
            	
            } else {  
            	log.info("收到文本数据的数据"+message.getPayload());
            	JSONObject jsonObj = JSONObject.fromObject(command);
        	    String type = jsonObj.getString("type");
        	    if("message".equals(type)){
        			JSONObject result = new JSONObject();
        			result.element("user",userId);
        			result.element("type", "message");
        			result.element("msg", jsonObj.getString("contentVal"));
        			String resultStr=result.toString();
        			
        			UserModelService.sendMessageToAllUser(resultStr);//向所有在线用户发送消息
        	    }
        	    if("connect".equals(type)){
        	    	log.info(userId+"发起视频请求,请求与"+jsonObj.getString("userName")+"发起视频会话");
        	    	String roomId=jsonObj.getString("roomId");
        	    	String userName=jsonObj.getString("userName");
        	    	JSONObject result = new JSONObject();
        	    	result.element("userName", userId);
        			result.element("roomId", roomId);
        			result.element("type", "connect");
        			String resultStr=result.toString();
        			UserModelService.sendMessageToUser(userName, resultStr); //视频请求转webrtc
        			
        	    }
            
            }  
        } catch (Exception e) {  
            return;  
        }  
    
    	

    }

    /**
     * 消息传输过程中出现的异常处理函数
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        // TODO Auto-generated method stub
    	System.out.println("出现异常了"+exception.getMessage());
         if (session.isOpen()) {  
        	 UserModelService.users.remove(session.getId());
        	// session.close();  
         } 

    }


    /**
     * websocket链接关闭的回调
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    	 String userId  = (String) session.getAttributes().get("userId");
         log.info("用户："+userId+" 关闭了连接");
         UserModelService.users.remove(userId);
         // 向前段发送数据移除连接
         JSONObject result = new JSONObject();
 		 result.element("type", "user_leave");
 		 result.element("user", userId);
 		 UserModelService.sendMessageToAllUser(result.toString());//向在线用户发送当前用户退出的消息
       
    }

    /**
     * 是否支持处理拆分消息，返回true返回拆分消息
     */
    @Override
    public boolean supportsPartialMessages() {
        // TODO Auto-generated method stub
        return false;
    }

	
    
    
    
    
    

}